shoryuken gemで簡単にSQSを使ったJob Queue WorkerをRailsに作成する
丹内です。
掲題のとおり、SQSを簡単に使うことができるshoryuken gemを使ってみました。
前提
- ruby 2.2.4
- rails 4.2.5
マネジメントコンソールでSQSの作成
AWSマネジメントコンソールのSQS画面から新規にキューを作成します。
Shoryukenによる負荷が抑えられるよう、Receive Message Wait Timeの設定を忘れないようにしてください。
インストール
Gemfileに以下のように書いてbundle installします。
gem 'shoryuken' group :development, :test do gem 'foreman' end
あとで解説しますが、railsアプリとは別にworkerプロセスも立ち上げるので、便利になるようforemn gemもインストールしています。
Jobクラスを作成
Shoryuken::Workerをincludeしたクラスを作成します。
$ bundle exec rails g job sample --queue shoryuken
これで作成されるapp/jobs/sample_job.rb
に、以下のようなクラスを作成します。
class SampleJob include Shoryuken::Worker shoryuken_options queue: 'sample', auto_delete: true, body_parser: :json def perform(message, data) # ここに処理を記述する。 # body_parserにjsonを指定しているのでdata['name']のようにすぐアクセスできる end end
shoryuken gemの設定ファイルを追加
どのキューに接続するかなどの設定をYAMLファイルに記載して、config/shoryuken.yml
に保存します。
このファイル名には規約はなく、workerプロセスを立ち上げるコマンド(bundle exec shoryuken)でファイルを指定します。
aws: access_key_id: <%= ENV["AWS_ACCESS_KEY_ID"] %> secret_access_key: <%= ENV["AWS_SECRET_ACCESS_KEY"] %> region: <%= ENV["AWS_REGION"] %> concurrency: 1 queues: - sample
この設定ファイルの場合、環境変数からクレデンシャル等を持ってくるので、別途direnvなどを使って設定しておきます。
参考:direnv で特定のディレクトリ下の環境変数を定義する
foremanで起動するように修正
foreman gemは開発時に複数プロセスを簡単に立ち上げることができる便利なgemです。
RAILS_ROOTにProcfile
という名前でファイルを作成すると、foreman startで全てを起動してくれます。
app: rm tmp/pids/server.pid; bundle exec rails s -b 0.0.0.0 -e development worker: bundle exec shoryuken -R -C config/shoryuken.yml
動作確認
コマンドラインからforemanを立ち上げます。
$ bundle exec shoryuken -R -C config/shoryuken.yml 2016-02-13T12:11:17Z 46415 TID-ovlxy1tkw INFO: Rails environment loaded I, [2016-02-13T21:11:17.408108 #46415] INFO -- : Celluloid 0.17.3 is running in BACKPORTED mode. [ http://git.io/vJf3J ] 2016-02-13T12:11:17Z 46415 TID-ovlz6t15s INFO: Starting
マネジメントコンソールからSQSにJSONメッセージを入れると、workerのログイに以下のように出ます。
2016-02-13T12:15:40Z 46415 TID-ovly43cho INFO: Found 1 messages for 'sample' 2016-02-13T12:15:40Z 46415 TID-ovlxyskcw SampleJob/sample/949770f5-93b5-41d8-80eb-f24f0f069480 INFO: started at 2016-02-13 21:15:40 +0900 2016-02-13T12:15:40Z 46415 TID-ovlxyskcw SampleJob/sample/949770f5-93b5-41d8-80eb-f24f0f069480 INFO: completed in: 672.6569999999999 ms
auto_delete: true
を設定しているので、workerの処理が正常に完了したらちゃんとSQSからも消えてます。
まとめ
SQSを使って簡単にJob Queue Workerを作れるshoryuken gemをご紹介しました。
ActiveJobにも対応しているようですし、AWS上で動くRailsアプリを作成するときには必須のgemだと思いました!
参考URL
- https://github.com/phstc/shoryuken
- http://qiita.com/iemon7stars/items/d4efdd8872d287906d29